今天是鐵人的第23天,主要介紹兩個抓取股票的套件,本來是要用爬蟲的方式擷取網路的股價資訊,後來發現這兩個套件,就想說那就用這兩個套件來取得歷史資料。之後幾天才會有抓取綜合損益表和資產負債表的文章。
可以下以下的指令,看Anaconda是否有安裝twstock
conda list
如果沒有安抓的話可以使用以下語法安裝
pip install twstock
twstock套件有非常多好用的function,以下示範列出台灣的所有股票,只是這個function非常吃資源,筆者跑了一次等了很久才出現。
import twstock
print(twstock.codes)
如果只是看某個股票可以使用
print(twstock.codes['6207'])
# 輸出結果
StockCodeInfo(type='股票', code='6207', name='雷科', ISIN='TW0006207004', start='2002/12/23', market='上櫃', group='電子零組件業', CFI='ESVUFR')
之後實現要抓取的股票的歷史資料(抓取最近31天的資料),假設要抓雷科(6207)
# 這是抓取歷史資料
stock_6207 = twstock.Stock('6207')
price_6207 = stock_6207.price[-5:] # 近五日之收盤價
high_6207 = stock_6207.high[-5:] # 近五日之盤中高點
low_6207 = stock_6207.low[-5:] # 近五日之盤中低點
date_6207 = stock_6207.date[-5:] # 近五日的日期
print('price_6207--->', price_6207)
print('high_6207--->', high_6207)
print('low_6207--->', low_6207)
print('date_6207--->', date_6207)
# 輸出結果
price_6207---> [30.25, 29.05, 29.35, 28.25, 28.45]
high_6207---> [30.4, 30.45, 29.75, 28.8, 29.1]
low_6207---> [29.35, 29.05, 29.0, 28.0, 28.0]
date_6207---> [datetime.datetime(2018, 10, 22, 0, 0), datetime.datetime(2018, 10, 23, 0, 0), datetime.datetime(2018, 10, 24, 0, 0), datetime.datetime(2018, 10, 25, 0, 0), datetime.datetime(2018, 10, 26, 0, 0)]
如果要抓取超過31天的資料可以使用fetch(),以下示範抓雷科(6207),2017年10月的資料
stock_6207_2017_10 = stock_6207.fetch(2017,10) # 獲取 2017 年 10 月之股票資料
當然還可以使用取得從過去到現在的股價,下面示範從2018年01月到現在的資料,並且用開盤價和收盤價畫成圖表
import matplotlib.pyplot as plt
import pandas as pd
stock_6207_2018 = stock_6207.fetch_from(2018,1) # 獲取 2018 年 01 月至今日之股票資料
stock_6207_2018_pd = pd.DataFrame(stock_6207_2018)
stock_6207_2018_pd = stock_6207_2018_pd.set_index('date')
fig = plt.figure(figsize=(10, 6))
plt.plot(stock_6207_2018_pd.close, '-' , label="收盤價")
plt.plot(stock_6207_2018_pd.open, '-' , label="開盤價")
plt.title('雷科股份2018 開盤/收盤價曲線',loc='right')
# loc->title的位置
plt.xlabel('日期')
plt.ylabel('收盤價')
plt.grid(True, axis='y')
plt.legend()
fig.savefig('day20_01.png')
這個套件不只可以抓取歷史資料也可以抓取即時資料。
stock_6207_real = twstock.realtime.get('6207')
# 抓取多個股票的方式 twstock.realtime.get(['2330', '2337', '2409'])
stock_6207_real
# 輸出結果
{'timestamp': 1540449000.0,
'info': {'code': '6207',
'channel': '6207.tw',
'name': '雷科',
'fullname': '雷科股份有限公司',
'time': '2018-10-25 14:30:00'},
'realtime': {'latest_trade_price': '28.25',
'trade_volume': '61',
'accumulate_trade_volume': '931',
'best_bid_price': ['28.20', '28.15', '28.10', '28.05', '28.00'],
'best_bid_volume': ['7', '29', '15', '10', '105'],
'best_ask_price': ['28.25', '28.30', '28.40', '28.45', '28.50'],
'best_ask_volume': ['6', '2', '1', '11', '5'],
'open': '28.20',
'high': '28.80',
'low': '28.00'},
'success': True}
從上面可以看出抓取即時資料只會抓出一筆,所以需要用schedule定時去抓,筆者等30天後在實作看看用aws的lambda去抓取。
可以下以下的指令,看Anaconda是否有安裝pandas-datareader
conda list
如果沒有的話則下
conda install pandas-datareader
使用以下函式抓取yahoo歷史資料,台灣股市的話要用 股票代號 加上 .TW
import pandas_datareader as pdr
df_2330 = pdr.DataReader('2330.TW', 'yahoo')
回傳的格式規格
參數名稱 | 描述 |
---|---|
Open | 開盤價 |
High | 最高價 |
Low | 最低價 |
Close | 收盤價 |
Volume | 交易量 |
Adj Close | 經過調整的收盤價 |
如果要加上擷取某個時段的歷史資料
startTime = '2018-10-01'
endTime = '2018-10-30'
df_2330 = pdr.DataReader('2330.TW', 'yahoo', startTime, endTime)
小弟是新手,想要請教在prompt安裝完twstock後,improt twstock指令是要在哪一個環境下? prompt or Jupyter notebook? 感恩
在Jupyter notebook中